#以gdb演示: 修改应用自身elf节.rela.plt中（导入）的glibc.so的exit函数地址 为 应用自身中的某个my_exit函数，  my_exit函数需要知道原先的exit函数地址 以方便调用原先的exit函数
#参考:  
#    https://blog.csdn.net/pwl999/article/details/108151244#t10
#   《链接器和加载器.pdf》"第10章 动态链接和加载" 的 小节 "使用 PLT 的惰性过程链接(lazy procedure linkage)"

#gdb --command=./glibc_exit_hook_gdb_script_example.gs  --args app.elf 


#第一次编译:
#cd /pubx/hook_mem_alloc; bash -x build.sh

#readelf -r app.elf
#   偏移量          信息           类型           符号值        符号名称 + 加数
# 000000404038  000700000007 R_X86_64_JUMP_SLO 0000000000000000 exit@GLIBC_2.2.5 + 0

#修改 app.c 中 变量 real_exit值为 0x000000404038

#第二次编译:
#cd /pubx/hook_mem_alloc; bash -x build.sh


#readelf -r app.elf
#   偏移量          信息           类型           符号值        符号名称 + 加数
# 000000404038  000700000007 R_X86_64_JUMP_SLO 0000000000000000 exit@GLIBC_2.2.5 + 0
#再次编译后 exit的地址不变 才能继续；
# 如果变了，则本演示无法继续：因为无法确定 app.c 中 变量 real_exit值为 填写多少。 

# readelf -s app.elf | grep my_exit
#     12: 00000000004011b6    94 FUNC    GLOBAL DEFAULT   15 my_exit

#到此时，可以确定以下gdb 脚本中的各数值，只要和上面的数值 一致即可

set pagination off

x/1xg 0x000000404038  
#0x404038 <exit@got.plt>:	0x0000000000401070
break main
run
set {long}0x000000404038=0x00000000004011b6 
x/1xg 0x000000404038
#0x404038 <exit@got.plt>:	0x00000000004011b6
delete all
continue
quit

#运行结果是打印了一次 my_exit:0
